Skip to content

feat(core): 叠加式显示页坐标映射层(#29 的 view_mapping) - #264

Merged
JavaZeroo merged 1 commit into
mainfrom
feat/view-mapping-layer
Oct 31, 2026
Merged

JavaZeroo merged 1 commit into
mainfrom
feat/view-mapping-layer

Conversation

@JavaZeroo

Copy link
Copy Markdown
Owner

问题与最终行为

#29 的四层堆叠 PR 无法重基到 main:分支是 view_mapping / origin 路线,而 main 已落地 #169 的行存储路线(owned id、sealed rows、history_view.hpp 80 行)。

证据:

文件 main 分支
history_view.hpp 80 行,owned/anchor 268 行,Piece/DisplayRow/Layout/ViewMapping
view_mapping.hpp 不存在 81 行
text_document.hpp 96 行,带 epoch、精确 index_of、order_revision、compare 81 行,无 epoch、index_of 用 lower_bound_line 会吸附邻居

main 的 text_document.hpp 比分支的更新。 所以本 PR 不采纳分支的整套行模型,只把其中可叠加的一层引入:显示页的每个片段携带它在源文档中的区间。

最终行为:

  • ViewMapping::hit() 把显示行列回映到 TextPosition
  • ViewMapping::project() 把文档区间投影回显示单元格
  • Screen 的行存储、历史与淘汰策略完全不变

与分支原版的必要适配

  1. 分支的 before() 用 line_id 排序。main 明确规定「id 不定义文档顺序」,改为 TextDocument::compare()——对重排行仍正确,并顺带获得 epoch 校验。
  2. main 的 TextPosition 带 epoch。映射因此会拒绝在旧缓冲区页面采集的坐标,而不是按 id 误判为有效。

验证

本机实际构建并运行(cmake -G "Visual Studio 17 2022" -A x64,Release):

view_mapping_test.vcxproj -> build\bin\Release\view_mapping_test.exe
view mapping checks passed            (exit 0)
owned buffer state checks passed      (exit 0,既有测试未受影响)

测试覆盖三条路径:

  1. 等宽片段的显示列 → 源列偏移映射
  2. 尾部合成填充没有独立源坐标,回落到最后一个片段的 end
  3. 切换缓冲区使 epoch 前进后,旧映射的 hit/project 均返回空

性能影响(如适用)

不适用。纯新增头文件与测试;未接入绘制或输入路径,运行期无调用方。

来源与限制

#29 的分支路线(view_mapping)与 main 已落地的行存储路线(#169 owned id /
sealed rows)是两套并行实现,直接重基会替换已验证的行模型。本提交只取其中可叠加的
一层:显示行的每个片段携带它在源文档中的区间,因此选择与 Find 能回映到文档坐标,
而 Screen 的行存储、历史与淘汰策略保持 main 现状。

与分支原版的两处必要适配:
- 分支用 line_id 比较文档顺序;main 明确 id 不定义文档顺序,改为 TextDocument::compare()
- main 的 TextPosition 带 epoch,映射据此拒绝在旧缓冲区页面上采集的坐标

新增 experiments/core/view_mapping_test.cpp 覆盖三条路径:等宽片段的列偏移映射、
尾部合成填充无源坐标、旧 epoch 坐标解析失败。CMake 注册 view_mapping_core。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant